package composite;


import composite.composite.FileSystemComponent;
import composite.composite.impl.Directory;
import composite.composite.impl.File;

/**
 * 组合结构的主程序
 * 组合模式（Composite）将对象组合成树形结构以表示“部分-整体”的层次结构，使得用户对单个对象和组合对象的使用具有一致性。
 * 组合模式可以以同样的方式处理单个对象和由多个对象组成的复合对象，从而简化客户端代码。
 * 假设您要开发一个文件系统。
 * 文件系统包含两种基本元素：文件 (File)和目录 (Directory)。文件是单个对象，而目录是复合对象，它内部可以包含文件或其他目录。
 * 问题：客户端代码如果想获取某个目录的大小，需要遍历其所有子元素（文件和子目录），并分别处理。
 * 如果想获取单个文件的大小，则直接获取。这导致代码逻辑复杂，需要区分处理。
 * 组合模式：通过组合模式，您可以将文件和目录都看作是“文件系统组件”。
 * 这样，无论是获取文件还是目录的大小，客户端都只需调用同一个方法，让底层实现自行处理。
 *
 * @author Liu Yicong
 * @date 2025/9/23
 */
public class CompositeClient {
	public static void main(String[] args) {
		// 创建文件
		FileSystemComponent file1 = new File("简历.doc", 100);
		FileSystemComponent file2 = new File("照片.jpg", 500);

		// 创建子目录
		Directory subDir = new Directory("项目文件");
		subDir.add(new File("代码.java", 200));
		subDir.add(new File("文档.pdf", 300));

		// 创建根目录
		Directory rootDir = new Directory("我的文档");
		rootDir.add(file1);
		rootDir.add(file2);
		rootDir.add(subDir); // 将子目录添加到根目录

		// 客户端只需使用 Component 接口即可处理
		System.out.println("--- 打印文件系统结构 ---");
		rootDir.print();

		System.out.println("\n--- 获取总大小 ---");
		System.out.println("总大小为: " + rootDir.getSize() + " KB");
	}

}
